package org.zebra.tenant.redis;

import cn.hutool.core.util.StrUtil;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.zebra.cache.util.RedisUtil;
import org.zebra.tenant.TenantHelper;

import java.io.Serializable;

/**
 * @author zhanghongbin
 */
public class TenantStringRedisSerializer extends StringRedisSerializer {

    /**
     * 序列化
     *
     * @param key 值
     * @return 结果
     */
    @Override
    public byte[] serialize(String key) {
        String realKey = key;

        // 需要过滤掉全局key，针对所有使用者都生效
        if (!key.startsWith("zebra:") && !key.startsWith(RedisUtil.GLOBAL_KEY)) {
            Serializable tenantId = TenantHelper.getTenantId();
            if (tenantId != null) {
                realKey = tenantId + ":" + realKey;
            }
        }
        return super.serialize(realKey);
    }

    /**
     * 反序列化
     *
     * @param bytes 数据
     * @return 结果
     */
    @Override
    public String deserialize(byte[] bytes) {
        String key = super.deserialize(bytes);
        if (!StrUtil.isEmpty(key)) {
            if (!key.startsWith("zebra:") && !key.startsWith(RedisUtil.GLOBAL_KEY)) {
                Serializable tenantId = TenantHelper.getTenantId();
                if (tenantId != null) {
                    return key.substring(tenantId.toString().length() + 1);
                }
            }
        }
        return key;
    }
}
